/**
 * WeChat 和 uniapp 的图片上传方法
 * recursion1 和 recursion2 分别式两种上传方式，但两只都只调用的接口都只支持单张图片上传
 * recursion1 使用promise等待单张图片上传
 */


// 服务器域名
import {
    baseUrl
} from '@/utils/base.js'
let api = baseUrl;
let network = 'http://82.156.205.64:8080/book'; //如果接口返回数据是相对路径需要向后台询问要拼接的域名

const baseData = {
    url: '', //开发者服务器地址
    data: {}, //开发接口所需其他参数
    imageUrl: [], //本地图片地址数组
    isSplit: false, //是否需要对数组进行分割 ，如果服务器返回有（大图，原图，缩略图）
	isAudio:false
}
// 处理传入数据
const formatData = (params) => {
    if (params.url.indexOf('http') == -1) params.url = api + params.url.replace(/\//, ''); //合并URL
    return params
}

// 调用微信API上传图片
// 判断如果该图片是网络图片直接返回
const upload = async (url, imageUrl, data) => {
	console.log(imageUrl,'imageUrlimageUrlimageUrlimageUrl')
    return await new Promise((resolve, reject) => {
        if (imageUrl.indexOf('http') > -1 && imageUrl.indexOf('http://tmp/') == -1) {
            resolve({
                data: imageUrl,
            })
        } else {
            uni.uploadFile({
                url: url, //仅为示例，非真实的接口地址
                filePath: imageUrl,
                name: 'file',
                formData: {
                    ...data
                },
                header: {
                    "token": uni.getStorageSync('user').token || '',
                    // "Authorization": ('Bearer' + uni.getStorageSync('user').token) || '',
                    // #ifndef H5
                    "content-type": "multipart/form-data"
                    // #endif
                },
                success: res => {
                    resolve(JSON.parse(res.data))
                },
                fail: err => {
                    console.log(err)
                    reject(false)
                }
            })
        }
    })
};


// 两种写法 1.等待上传递归回调 2.promise.all同步上传
// 写法一.  上传提示 --- 等待上传 --- 删除首张图片 --- 处理本次上传（合并上传图片）--- 再次执行下张图片（递归） OR  循环完所有图片（返回结果）
const recursion1 = async (obj, fun, generateArr = []) => {
    if (obj.imageUrl.length) {
        uni.showLoading({
            title: `正在上传第${generateArr.length + 1}张图片`,
            mask: true
        });
        const _res = await upload(obj.url, obj.imageUrl[0], obj.data);
        obj.imageUrl.shift();
        if (_res) {
            console.log('%c请求结果:', 'color:green;', _res);
            const _data = network + _res.data
            if (obj.isSplit) {
                generateArr = [...generateArr, [_data.thumbImgUrl, _data.bigImgUrl, _data.sourceImgUrl].join(obj
                    .ruleInside)] //该部分代码根据后台返回数据结构自行调正
            } else {
                generateArr = [...generateArr, _data]
            }
        };
        //递归
        await recursion1(obj, fun, generateArr)
    } else {
        uni.hideLoading()
        if (obj.isSplit) {
            return fun(generateArr.join(obj.ruleExtra))
        } else {
            return fun(generateArr)
        }
    }
}

// 写法二. Promise.all 将本地地址都转换成Promise对象 --- Promise.all等待执行完成返回结果
const recursion2 = async (obj, fun, generateArr = []) => {
	// console.log(obj,'objobjobjobjobjobjobjobj')
    obj.imageUrl.map((v, i) => {
        obj.imageUrl[i] = new Promise((res, rej) => {
			// console.log(obj.imageUrl[i],'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii')
            if (obj.imageUrl[i].startsWith('http') && !obj.imageUrl[i].includes('http://tmp')) {
                res({
					fullurl:obj.imageUrl[i],
					url:'/uploads/'+obj.imageUrl[i].split('/uploads/')[1]
				})
            } else {
				let nexturl = obj.isAudio?'/api/common/uploadmp3':'/api/Common/upload'
				console.log(obj.isAudio,'aaaaaaaaaaaaaaaaaaaaaaa')
                uni.uploadFile({
                    url: baseUrl + nexturl, //仅为示例，非真实的接口地址
                    filePath: obj.imageUrl[i],
                    name: 'file',
                    header: {
                        "token": uni.getStorageSync('user').token || '',
                        // #ifndef H5
                        "content-type": "multipart/form-data"
                        // #endif
                    },
					formData: obj.data,
                    success: (reslove) => {
                        // console.log(JSON.parse(reslove.data), '+++++++++++')
						const code = JSON.parse(reslove.data).code;
						if(code==1){
							res(JSON.parse(reslove.data).data)
						}else{
							rej(reslove)
							uni.hideLoading()
							uni.$tt(JSON.parse(reslove.data).msg);
						}
                    },
                    fail: (err) => {
						rej(err)
						uni.hideLoading()
						console.log('上传失败，请稍后重试！')
						// uni.$tt('上传失败，请稍后重试！');
                    }
                })
            }
        })
    });
    Promise.all([...obj.imageUrl]).then(res => {
        return fun(res)
    }).catch(err => {
        console.log(err)
    })
}




const uploadFile = async (params) => {
    uni.showLoading({
        title: uni.getLocale()=='en'?'Uploading':'上传中...',
        mask: true
    })
    return await new Promise((resolve, reject) => {
        let _data = formatData({
            ...baseData,
            ...params
        })
        recursion2(_data, res => {
            resolve(res)
        })
    })
}




export {
    uploadFile
}
